#ifndef LIB_H
#define LIB_H

#include <string>
#include <fstream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include "debugstreams.h"
#include "ListeSorts.h"
using namespace std;

enum TypeClasse
{
  Toutes,
  Combattants,
  Magiciens,
  Pretres,
  Roublards
};

struct ListCapa
{
  string Capa;       // Nom de la capacité (=> Race)
  unsigned int Cout; // Cout de la capacité
};

struct ListComp
{
  string Comp;       // Nom de la compétence (=> Classe)
  unsigned int Cout; // Cout de la compétence
  bool Pourcentage;  // Associé à un pourcentage ?
};

struct ListNonMart
{
  string Comp;          // Nom de la compétence non-martiale
  unsigned int Cout;    // Cout de la compétence
  unsigned int Valeur;  // Valeur de base
  unsigned int Trait1;  // Trait associé 1
  unsigned int Trait2;  // Trait associé 2
  TypeClasse Cl_Admise; // Classe autorisée
};

class Sort : public vector<unsigned int>
{
 public:
  Sort(const unsigned int& ecole = 0, const unsigned int& niveau = 1
       , const unsigned int& numero = 0);
  Sort(const Sort& sort);
  ~Sort();
  bool operator<(const Sort& sort) const;
  bool operator>(const Sort& sort) const;
  bool operator==(const Sort& sort) const;
  friend ostream& operator<<(ostream& out, const Sort& sort);
 private:
  bool verifie() const;
};

int puissance(int a, unsigned int b);

unsigned int digit(const int& a, const int& b);

string write_int(const unsigned int& nbr);

unsigned int demander_unsigned(const string& question);

unsigned int demander_unsigned_borne(const string& question,
				     const unsigned int& min,
				     const unsigned int& max);

string affiche_accent(const string& brut);

unsigned int affiche_sorts(const unsigned int& ecole,
			   const unsigned int& niveau);

bool safe_push_back(vector<unsigned int> *ptr, const unsigned int& valeur);

void gerer_espaces_blancs(char* tab[], int& nbr, vector<string>& retour);

#endif
